/**
 * fshows.com
 * Copyright (C) 2013-2019 All Rights Reserved.
 */
package com.example.proxydemo.mycglib;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * java源代码编译成字节码
 *
 * @author Liluqing
 * @version JavaCompilerUtil.java, v 0.1 2019-08-08 14:16
 */
public class JavaCompilerUtil {

    /**
     * 将java源文件编译为class
     *
     * @param javaSourcePath 源文件路径
     * @return Class
     */
    public static boolean compile(String javaSourcePath) {
        // 通过 ToolProvider 取得 JavaCompiler 对象，JavaCompiler 对象是动态编译工具的主要对象
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        // 通过 JavaCompiler 取得标准 StandardJavaFileManager 对象，StandardJavaFileManager 对象主要负责
        // 编译文件对象的创建，编译的参数等等，我们只对它做些基本设置比如编译 CLASSPATH 等。
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        // 从java源文件中读取源代码并编译
        File javafile = new File(javaSourcePath);
        Iterable<? extends JavaFileObject> files = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(new File[]{javafile}));
        String flag = "-d";
        String outDir = "";
        try {
            File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());
            outDir = classPath.getAbsolutePath() + File.separator;
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
        Iterable<String> options = Arrays.asList(flag, outDir);
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, files);
        return task.call();
    }
}